package app.mvp.api;

import android.content.Context;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import app.mvp.utils.TUtil;
import http.CallBack;
import http.IWeiLiCaiResultDistribute;
import utils.GsonUtils;
import utils.LogUtils;
import utils.ToastUtils;

/**
 * Created by 刘智强 on 2017/3/14.
 * 处理网络回调的适配器
 */

public class ResultDistribute<T> implements IWeiLiCaiResultDistribute {
    private Context context;
    protected CallBack callBack;
    private Class<T> entityClass;//泛型的类型
    public ResultDistribute(Context context,Class<T> entity, CallBack callBack) {
        entityClass = this.getSuperClass();
        this.context = context;
        this.callBack = callBack;
        this.entityClass=entity;

    }

    @Override
    public void error(String errorInfo) {
        ToastUtils.myToast(context,errorInfo);

    }

    @Override
    public void success(String code, String message, String returnInfo) {
        //成功
        try {
            LogUtils.e(entityClass.getName());
            if (returnInfo.startsWith("{")) {
                //实体
                T data = GsonUtils.fromJson(returnInfo, entityClass);
                callBack.success(code, message, data);
            } else if (returnInfo.startsWith("[")) {
                //List<实体>
                List<T> data = GsonUtils.fromJsonArray(returnInfo, entityClass);
                callBack.success(code, message, data);
            }

        } catch (Exception e) {
            e.printStackTrace();
            ToastUtils.myToast(context, "数据解析出现问题了");
        }
    }

    @Override
    public void singleSignOn(String code, String message, String returnInfo) {

    }

    @Override
    public void showReturnMessage(String code, String message, String returnInfo) {
        ToastUtils.myToast(context,message);

    }

    @Override
    public void fail(String code, String message, String returnInfo) {
        callBack.fail(code, message, returnInfo);

    }

    @Override
    public void printResultData(String code, String message, String returnInfo) {
        LogUtils.e(returnInfo);
        LogUtils.e(code);
        LogUtils.e(message);
    }

    @Override
    public void start() {

    }

    @Override
    public void completed() {

    }


    /**
     * 获取泛型类型
     *
     * @return
     */
    private Class getSuperClass() {
        return getSuperClassGenricType(getClass(), 0);
    }

    /**
     * 通过反射, 获得定义Class时声明的父类的泛型参数的类型. 如无法找到, 返回Object.class.
     *
     * @param clazz
     * @param index
     * @return
     */
    private Class<Object> getSuperClassGenricType(final Class clazz, final int index) {

        //返回表示此 Class 所表示的实体（类、接口、基本类型或 void）的直接超类的 Type。
        Type genType = clazz.getGenericSuperclass();
        if (!(genType instanceof ParameterizedType)) {
            return Object.class;
        }
        //返回表示此类型实际类型参数的 Type 对象的数组。
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
        if (index >= params.length || index < 0) {
            return Object.class;
        }
        if (!(params[index] instanceof Class)) {
            return Object.class;
        }

        return (Class) params[index];
    }
}
